import { default as axios, AxiosRequestConfig, AxiosResponse } from "axios";
import store from "@/store";

interface DownloadExcelConfig<D> extends AxiosRequestConfig<D> {
    /**
     * 下载的文件名称（含后缀名）
     */
    fileName: string
}

// 后端API接口返回的数据格式
interface IResusltEntity<T = any> {
    code: number,
    data: T,
    msg: string
}

const baseURL = "/api";

/**
 * 发起异步http请求
 */
export default <D = any, T = any>(config: AxiosRequestConfig<D>): Promise<AxiosResponse<IResusltEntity<T>>> => {
    config.baseURL = baseURL;

    // 如果有token，添加到请求头中
    const token = store.state.admin?.token;
    if (token) {
        // 合并对象
        config.headers = Object.assign(
            {
                Authorization: token
            },
            config.headers);
    }
    // 做失败的预处理
    const promise = axios(config);
    promise.then(res => {
        if (res.data.code < 0) {
            alert(res.data.msg);
        }
    }, () => {
        alert("操作失败")
    });
    return promise;
}

/**
 * 导出excel
 * @param url 接口地址
 */
export const downloadExcel = <D = any>(config: DownloadExcelConfig<D>): void => {
    const token = store.state.admin?.token;
    if (token) {
        // 合并对象
        config.headers = Object.assign(
            {
                Authorization: token
            },
            config.headers);
    }
    axios({
        baseURL,
        method: 'POST',
        url: config.url,
        responseType: 'arraybuffer',
        data: config.data,
        headers: config.headers,
    }).then(res => {
        // 这里 data 是返回来的二进制数据
        const blob = new Blob([res.data], {
            type: "application/x-msdownload;charset=UTF-8",
        });
        // 创建一个blob的对象链接
        const url = window.URL.createObjectURL(blob);
        const link = document.createElement('a');
        // 把获得的blob的对象链接赋值给新创建的这个 a 链接
        link.href = url;
        // 设置下载文件名
        link.setAttribute('download', config.fileName || '列表数据.xlsx');
        document.body.appendChild(link);
        // 使用js点击这个链接
        link.click();
        // 下载完成移除元素
        document.body.removeChild(link);
        // 释放blob对象
        window.URL.revokeObjectURL(url);
    }, () => {
        alert("导出失败");
    })
}